{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Part 8 পুনর্বার প্রোটোকল পরিচয় (bis - Introduction to Protocols)\n",
    "\n",
    "### প্রসঙ্গ (Context) \n",
    "\n",
    "এখন আমরা পরিকল্পনার মধ্য দিয়ে চলেছি, আমরা প্রোটোকল নামে একটি নতুন অবজেক্ট প্রবর্তন করব। একটি প্রোটোকল পরিকল্পনাগুলির একটি ক্রম সমন্বয় করে, সেগুলি দূরবর্তী কর্মীদের উপর স্থাপন করে\n",
    "এবং তাদের একক পাস চালাতে।\n",
    "\n",
    "এটি একটি উচ্চ স্তরের অবজেক্ট যা একটি জটিল গণনার যুক্তি যুক্ত করে\n",
    "বিভিন্ন শ্রমিক জুড়ে বিতরণ। প্রোটোকলের প্রধান বৈশিষ্ট্য হ'ল\n",
    "কর্মীদের মধ্যে এবং শেষ পর্যন্ত প্রেরণ / অনুসন্ধান / ফেরত পাঠানোর ক্ষমতা\n",
    "চিহ্নিত কর্মীদের মোতায়েন। সুতরাং কোনও ব্যবহারকারী একটি প্রোটোকল ডিজাইন করতে পারেন, এটি আপলোড করতে পারেন\n",
    "কোনও মেঘকর্মীর কাছে এবং অন্য যে কোনও শ্রমিকরা এটি অনুসন্ধান করতে সক্ষম হবেন,\n",
    "এটি ডাউনলোড করুন, এবং এটি কর্মীদের উপর থাকা গণনা প্রোগ্রামটি প্রয়োগ করুন\n",
    "যে এটি সংযুক্ত আছে।\n",
    "\n",
    "আসুন দেখি কীভাবে এটি ব্যবহার করবেন।\n",
    "\n",
    "Authors:\n",
    "- Théo Ryffel - Twitter [@theoryffel](https://twitter.com/theoryffel) - GitHub: [@LaRiffle](https://github.com/LaRiffle)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "অনুবাদক:\n",
    "\n",
    "- Sourav Das - Twitter: [@adventuroussrv](https://twitter.com/adventuroussrv)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. তৈরি করুন এবং মোতায়েন করুন (Create and deploy)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "প্রোটোকল জোড়াগুলির তালিকা সরবরাহ করে তৈরি করা হয় `(worker, plan)`. `worker` হয় একটি বাস্তব হতে পারে\n",
    "কর্মী বা একটি কর্মী আইডি বা একটি কল্পিত কর্মীর প্রতিনিধিত্ব করার জন্য একটি স্ট্রিং। এই\n",
    "দুটি ক্ষেত্রে পরিকল্পনা হওয়া উচিত তা নির্দিষ্ট করতে শেষ কেসটি তৈরিতে ব্যবহার করা যেতে পারে\n",
    "স্থাপনার সময়ে একই শ্রমিকের মালিকানাধীন (বা মালিকানাধীন নয়)। `plan` হয় পরিকল্পনা বা একটি পয়েন্টারপ্ল্যান হতে পারে।"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch as th\n",
    "import syft as sy\n",
    "hook = sy.TorchHook(th)\n",
    "\n",
    "# IMPORTANT: Local worker should not be a client worker\n",
    "hook.local_worker.is_client_worker = False"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "আসুন 3 টি পরিকল্পনা সংজ্ঞায়িত করুন এবং এগুলি একটি প্রোটোকলে ফিড করুন। তারা সবাই একটি ইনক্রিমেন্ট অপারেশন করে।"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "@sy.func2plan(args_shape=[(1,)])\n",
    "def inc1(x):\n",
    "    return x + 1\n",
    "\n",
    "@sy.func2plan(args_shape=[(1,)])\n",
    "def inc2(x):\n",
    "    return x + 1\n",
    "\n",
    "@sy.func2plan(args_shape=[(1,)])\n",
    "def inc3(x):\n",
    "    return x + 1\n",
    "\n",
    "protocol = sy.Protocol([(\"worker1\", inc1), (\"worker2\", inc2), (\"worker3\", inc3)])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "এখন আমাদের কর্মীদের কাছে প্রোটোকলটি বাঁধতে হবে, যা কল করে করা হয় `.deploy(*workers)`. আসুন কিছু কর্মী তৈরি করা যাক।"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "bob = sy.VirtualWorker(hook, id=\"bob\")\n",
    "alice = sy.VirtualWorker(hook, id=\"alice\")\n",
    "charlie = sy.VirtualWorker(hook, id=\"charlie\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "workers = alice, bob, charlie\n",
    "\n",
    "protocol.deploy(*workers)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "আপনি দেখতে পাচ্ছেন যে পরিকল্পনাগুলি ইতিমধ্যে উপযুক্ত কর্মীদের কাছে প্রেরণ করা হয়েছে: এটি মোতায়েন করা হয়েছে!\n",
    "\n",
    "এটি ২ টি পর্যায়ক্রমে করা হয়েছে: প্রথমে আমরা সৃষ্টিতে প্রদত্ত কল্পনাপ্রসূত শ্রমিকদের ম্যাপ করি\n",
    "সরবরাহকারী কর্মীদের কাছে (স্ট্রিং দ্বারা নামযুক্ত), এবং দ্বিতীয়টি, আমরা সংশ্লিষ্টটি প্রেরণ করি\n",
    "তাদের প্রতিটি পরিকল্পনা।"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. একটি প্রোটোকল চালান (Run a protocol)\n",
    "\n",
    "প্রোটোকল চালানো মানে সমস্ত পরিকল্পনা ক্রমান্বয়ে সম্পাদন করা। এটি করতে, আপনি কিছু ইনপুট ডেটা সরবরাহ করেন যা প্রথম পরিকল্পনার স্থানে প্রেরণ করা হয়। এই প্রথম পরিকল্পনা\n",
    "রান করুন এবং এর আউটপুট দ্বিতীয় পরিকল্পনার স্থানে সরানো হয়েছে, ইত্যাদি। চূড়ান্ত\n",
    "সমস্ত পরিকল্পনা চলার পরে ফলাফলটি ফিরে আসে এবং এটি পয়েন্টারগুলির সমন্বয়ে গঠিত\n",
    "শেষ পরিকল্পনা অবস্থান।"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = th.tensor([1.0])\n",
    "ptr = protocol.run(x)\n",
    "ptr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "ptr.get()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "ইনপুট 1.0 টি 3 টি পরিকল্পনার মধ্যে দিয়ে গেছে এবং তাই 3 বার বাড়ানো হয়েছে, এ কারণেই এটি এখন 4.0 এর সমান!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "প্রকৃতপক্ষে, আপনি **ডেটাতে কিছু পয়েন্টারে রিমোট** একটি প্রোটোকল চালাতে পারেন:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "james = sy.VirtualWorker(hook, id=\"james\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "protocol.send(james)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = th.tensor([1.0]).send(james)\n",
    "ptr = protocol.run(x)\n",
    "ptr"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "আপনি দেখতে পান ফলাফলটি জেমসের পয়েন্টার"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "ptr = ptr.get()\n",
    "ptr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "ptr = ptr.get()\n",
    "ptr"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. একটি প্রোটোকল অনুসন্ধান করুন (Search for a protocol)\n",
    "\n",
    "আসল সেটিংসে আপনি একটি রিমোট প্রোটোকল ডাউনলোড করতে, এটি আপনার কর্মীদের উপর স্থাপন এবং এটি আপনার সাথে ডেটা চালাতে চাইতে পারেন"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "আসুন একটি প্রোটোকল শুরু করুন **যা নিযুক্ত নয়**, এবং এটি একটি দূরবর্তী কর্মীর উপর রাখি"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "protocol = sy.Protocol([(\"worker1\", inc1), (\"worker2\", inc2), (\"worker3\", inc3)])\n",
    "protocol.tag('my_protocol')\n",
    "protocol.send(james)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "me = sy.hook.local_worker # get access to me as a local worker"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "প্রোটোকলটি খুঁজতে এখন আমরা একটি অনুসন্ধান শুরু করি"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "responses = me.request_search(['my_protocol'], location=james)\n",
    "responses"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "আপনার প্রোটোকলের একটি পয়েন্টারে অ্যাক্সেস রয়েছে"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "ptr_protocol = responses[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "সাধারণ পয়েন্টারের মতো আপনি এটিকে ফিরে পেতে পারেন"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "protocol_back = ptr_protocol.get()\n",
    "protocol_back"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "এবং আমরা অংশ 1 এবং 2 এর মতো করতে পারি।"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "protocol_back.deploy(alice, bob, charlie)\n",
    "\n",
    "x = th.tensor([1.0])\n",
    "ptr = protocol_back.run(x)\n",
    "ptr.get()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "আরও প্রকৃত বিশ্বের উদাহরণগুলি প্রোটোকল সহ আসবে, তবে আপনি ইতিমধ্যে এই নতুন অবজেক্টের দ্বারা খোলার সমস্ত সম্ভাবনা দেখতে পাবেন!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### গিটহাবে পাইসিফ্ট কে স্টার দিন (Star PySyft on GitHub)\n",
    "\n",
    "আমাদের সম্প্রদায়কে সাহায্য করার সবচেয়ে সহজ উপায় হল রিপোসিটোরি গুলোতে ষ্টার করা\n",
    " এটি আমরা যে অসাধারণ সরঞ্জামগুলি তৈরি করছি তার সচেতনতা বাড়াতে সহায়তা করে।\n",
    " \n",
    "- [Star PySyft](https://github.com/OpenMined/PySyft)\n",
    "\n",
    "### গিটহাবে আমাদের টিউটোরিয়ালগুলি চয়ন করুন (Pick our tutorials on GitHub!)\n",
    "\n",
    "ফেডারেটেড এবং প্রাইভেসি-প্রিজারভেভিং লার্নিংয়ের চেহারা কেমন হওয়া উচিত এবং আমরা এটির জন্য ইটগুলি কীভাবে তৈরি করছি সে সম্পর্কে আরও ভাল ধারণা পেতে আমরা সত্যিই দুর্দান্ত টিউটোরিয়াল তৈরি করেছি।\n",
    "\n",
    "- [Checkout the PySyft tutorials](https://github.com/OpenMined/PySyft/tree/master/examples/tutorials)\n",
    "\n",
    "\n",
    "### আমাদের স্ল্যাক যোগ দিন (Join our Slack!)\n",
    "\n",
    "সর্বশেষতম অগ্রগতিতে আপ টু ডেট রাখার সর্বোত্তম উপায় হ'ল আমাদের সম্প্রদায়ে যোগদান করা!\n",
    "\n",
    "- [Join slack.openmined.org](http://slack.openmined.org)\n",
    "\n",
    "### একটি কোড প্রকল্পে যোগদান করুন! (Join a Code Project!)\n",
    "\n",
    "আমাদের সম্প্রদায়ে অবদান রাখার সর্বোত্তম উপায় হল কোড অবদানকারী হয়ে উঠুন! যে কোনও সময় আপনি পাইসাইফ্ট গিটহাবে ইস্যু পৃষ্ঠাতে যেতে পারেন এবং \"প্রকল্পগুলি\" এর জন্য ফিল্টার করতে পারেন। এটি আপনাকে শীর্ষ স্তরের সমস্ত টিকিট দেখিয়ে দেবে যে আপনি কোন প্রকল্পগুলিতে যোগদান করতে পারেন তার একটি ওভারভিউ দেয়! আপনি যদি কোনও প্রকল্পে যোগ দিতে না চান তবে আপনি কিছুটা কোডিং করতে চান তবে আপনি \"ভাল প্রথম ইস্যু\" চিহ্নিত গিটহাব ইস্যুগুলি অনুসন্ধান করে আরও \"ওয়ান অফ\" মিনি-প্রকল্পগুলির সন্ধান করতে পারেন।\n",
    "\n",
    "- [Good First Issue Tickets](https://github.com/OpenMined/PySyft/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)\n",
    "\n",
    "### দান করুন (Donate)\n",
    "\n",
    "আপনার যদি আমাদের কোডবেসে অবদান রাখার সময় না থাকে তবে তবুও সমর্থন দিতে চান, আপনি আমাদের ওপেন কালেক্টিভেরও Backer হয়ে উঠতে পারেন। সমস্ত অনুদান আমাদের ওয়েব হোস্টিং এবং অন্যান্য সম্প্রদায় ব্যয় যেমন হ্যাকাথনস এবং মেটআপগুলির (hackathons and meetups!) দিকে যায়!\n",
    "\n",
    "- [Donate through OpenMined's Open Collective Page](https://opencollective.com/openmined)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
